#Import data set either using read.csv or RStudio's GUI

#Check the head of the data to see what we are looking at
head(train)
NA
NA
NA
NA
NA
NA
#Let's check to see if there are any N/A values in the data set
any(is.na(train))
[1] TRUE
library(Amelia)

missmap(train)

#According to the missmap from the Amelia library, Area Income appears to be the only one missing some data. Let's start visualizing the data first to see if Area Income has a major impact on whether or not someone clicked on the ads.

library(ggplot2)
pl <- ggplot(train, aes(Area.Income, Daily.Time.Spent.on.Site)) + geom_point(aes(color = factor(Clicked)))
pl

NA
NA
#Notice that income does not appear to play a major role in whether or not people clicked on the ads. People of all incomes, according to this plot, click on the ads. The more important factor here appears to be the daily time spent on the site. Let's examine another variable similar to this one that resides within the data frame. 

pl2 <- ggplot(train, aes(Daily.Internet.Usage, Daily.Time.Spent.on.Site)) + geom_point(aes(color = factor(Clicked)))
pl2

NA
NA
NA
NA
NA
#There is still a significant amount of clustering here, but in my opinion, it appears to be a tighter cluster in terms of the Area Income. Let's examine Daily Internet Usage mapped by Area Income.
pl3 <- ggplot(train, aes(Area.Income, Daily.Internet.Usage)) + geom_point(aes(color = factor(Clicked)))
pl3

#This plot looks pretty similar to the first one we examined. Given these two variables alone, we have a pretty good idea of whether or not a user clicked on the ads. Let's do more EDA then begin working on training our model.

pl4 <- ggplot(train, aes(Age)) + geom_histogram(fill = "blue", color = "black", alpha = 0.5, bins = 40)
pl4

pl5 <- ggplot(train, aes(Daily.Internet.Usage)) + geom_histogram(fill = "blue", color = "black", alpha = 0.5, bins = 40)
pl5

pl6 <- ggplot(train, aes(gender)) + geom_bar(aes(fill = factor(gender), alpha = 0.5))
pl6

pl7 <- ggplot(train, aes(Clicked, Area.Income)) + geom_boxplot(aes(group=Clicked, fill=factor(Clicked), alpha = 0.4))
ggplotly(pl7)
Removed 225 rows containing non-finite values (stat_boxplot).`group_by_()` is deprecated as of dplyr 0.7.0.
Please use `group_by()` instead.
See vignette('programming') for more help
This warning is displayed once every 8 hours.
Call `lifecycle::last_warnings()` to see where this warning was generated.
#We see from the plots above some very interesting information. The people that clicked on the ads spend less time on the internet in general and on the site each day. They also tend to have lower incomes, per the boxplot. Let's write a function to impute Area.Income into the missing spots.

#Using plotly, we can easily get the median Area Income to impute for each group: 62,430.55 where Clicked=0; 50,306.31 where Clicked=1.


 impute_income <- function(income, clicked) {
   out <- income
   for (i in 1:length(income)){
     if(is.na(income[i]))
    {
       if(clicked[i] == 0)
         {
            out[i] <- 62430.55
         }
       else
         {
            out[i] <- 50306.31
         }
    }
     else
    {
       out[i] <- income[i]
    }
   }
   return(out)
}

original.incomes <- train$Area.Income

fixed.incomes <- impute_income(train$Area.Income, train$Clicked)

train$Area.Income <- fixed.incomes
missmap(train, col = c("yellow", "black"))

#Great! Having no missing data is a good feeling. Now, let's start running some models. Begin with K-means and the relevant columns.
library(cluster)

df.relevant <- data.frame(train$Daily.Time.Spent.on.Site, train$Daily.Internet.Usage)

cluster.click <- kmeans(df.relevant, 2, nstart = 10)
library(cluster)

#Let's look at the clusplot!

clusplot(df.relevant, cluster.click$cluster, color = TRUE, shade = TRUE, labels = 0, lines = 0)

library(factoextra)

sil <- silhouette(cluster.click$cluster, dist(df.relevant))
fviz_silhouette(sil)

#Let's start the KNN model:
var(train2[, 1])
[1] 83416.67
var(train2[, 3])
[1] 249.0543
clicked <- train2[, 10]

knn.df <- data.frame(train2$Daily.Time.Spent.on.Site, train2$Daily.Internet.Usage)

knn.df <- cbind(knn.df, clicked)

knn.standardized <- scale(knn.df[, -3])


var(knn.standardized[, 1])
[1] 1
var(knn.standardized[, 2])
[1] 1
#Test - first 300 rows for test set
test.index <- 1:300
test.data <- knn.standardized[test.index, ]
test.clicked <- clicked[knn.test.index]

#Train
train.data <- knn.standardized[-test.index, ]
train.clicked <- clicked[-test.index] 
#Run the model
library(class)

predictions.clicked <- knn(train.data, test.data, train.clicked, k=3)

mean(test.clicked != predictions.clicked)
[1] 0.1633333
#Let's observe the model with other k-values
predictions.clicked <- NULL
error.rate <- NULL

for (i in 1:25) {
  predictions.clicked <- knn(train.data, test.data, train.clicked, k=i)
  error.rate[i] <- mean(test.clicked != predictions.clicked)
}
k.values <- 1:25

error.df <- data.frame(error.rate, k.values)

pl8 <- ggplot(error.df, aes(k.values, error.rate)) + geom_point() + geom_line(lty="dotted", color = "red")
ggplotly(pl8)

NA
#So, the model runs most accurately with k=3; so that is what we will choose.
final.predictions.clicked <- knn(train.data, test.data, train.clicked, k=3)

mean(test.clicked != final.predictions.clicked)
[1] 0.1633333
#The model is approximately 83.67% accurate in it's predicitons.
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2sgLSBLLW1lYW5zIFByYWN0aWNlIC0gQnJ5YW4gSG9uZWNrICINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KYGBge3J9DQojIyMjIw0KI1RoZSBnaXZlbiBkYXRhc2V0IGhhcyAxLDAwMCByZWNvcmRzIG9mIHVzZXJzIHdpdGggMTAgYXR0cmlidXRlcy4gVGhlIGNsYXNzaWZpY2F0aW9uIHZhcmlhYmxlIGlzIHdoZXRoZXIgb3Igbm90IHRoZXkgY2xpY2tlZCBvbiBhbiBhZHZlcnRpc2VtZW50LCBkZW5vdGVkIDAgb3IgMSBpbiB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlIGRhdGEgZnJhbWUuIFdlIGFyZSB0cnlpbmcgdG8gcHJlZGljdCB3aGljaCB1c2VycyBhcmUgbW9yZSBsaWtlbHkgdG8gY2xpY2sgb24gdGhlIGFkdmVydGlzZW1lbnRzLg0KIyMjIyMNCg0KDQojSW1wb3J0IGRhdGEgc2V0IGVpdGhlciB1c2luZyByZWFkLmNzdiBvciBSU3R1ZGlvJ3MgR1VJDQojdHJhaW4gPC0gcmVhZC5jc3YoIkM6L1VzZXJzL0JyeWFuL0Rvd25sb2Fkcy90cmFpbi5jc3YiKQ0KDQojQ2hlY2sgdGhlIGhlYWQgb2YgdGhlIGRhdGEgdG8gc2VlIHdoYXQgdGhlIGRhdGEgbG9va3MgbGlrZS4NCmhlYWQodHJhaW4pDQoNCmBgYA0KDQpgYGB7cn0NCiNMZXQncyBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBOL0EgdmFsdWVzIGluIHRoZSBkYXRhIHNldC4NCmFueShpcy5uYSh0cmFpbikpDQpsaWJyYXJ5KEFtZWxpYSkNCg0KbWlzc21hcCh0cmFpbikNCg0KYGBgDQpgYGB7cn0NCiNBY2NvcmRpbmcgdG8gdGhlIG1pc3NtYXAgZnJvbSB0aGUgQW1lbGlhIGxpYnJhcnksIEFyZWEgSW5jb21lIGFwcGVhcnMgdG8gYmUgdGhlIG9ubHkgb25lIG1pc3Npbmcgc29tZSBkYXRhLiBMZXQncyBzdGFydCB2aXN1YWxpemluZyB0aGUgZGF0YSBmaXJzdCB0byBzZWUgaWYgQXJlYSBJbmNvbWUgaGFzIGEgbWFqb3IgaW1wYWN0IG9uIHdoZXRoZXIgb3Igbm90IHNvbWVvbmUgY2xpY2tlZCBvbiB0aGUgYWRzLiBTdXBwb3NlIGl0IGRvZXM7IHdlIHdpbGwgd3JpdGUgYSBmdW5jaXRvbiB0aGF0IHdpbGwgaW1wdXRlIGFnZSBhcyBhY2N1cmF0ZWx5IGFzIHBvc3NpYmxlLg0KDQpsaWJyYXJ5KGdncGxvdDIpDQpwbCA8LSBnZ3Bsb3QodHJhaW4sIGFlcyhBcmVhLkluY29tZSwgRGFpbHkuVGltZS5TcGVudC5vbi5TaXRlKSkgKyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGZhY3RvcihDbGlja2VkKSkpDQpwbA0KDQoNCmBgYA0KYGBge3J9DQojTm90aWNlIHRoYXQgaW5jb21lIGRvZXMgbm90IGFwcGVhciB0byBwbGF5IGEgbWFqb3Igcm9sZSBpbiB3aGV0aGVyIG9yIG5vdCBwZW9wbGUgY2xpY2tlZCBvbiB0aGUgYWRzLiBQZW9wbGUgb2YgYWxsIGluY29tZXMsIGFjY29yZGluZyB0byB0aGlzIHBsb3QsIGNsaWNrIG9uIHRoZSBhZHMuIFRoZSBtb3JlIGltcG9ydGFudCBmYWN0b3IgaGVyZSBhcHBlYXJzIHRvIGJlIHRoZSBkYWlseSB0aW1lIHNwZW50IG9uIHRoZSBzaXRlLiBMZXQncyBleGFtaW5lIGFub3RoZXIgdmFyaWFibGUgc2ltaWxhciB0byB0aGlzIG9uZSB0aGF0IHJlc2lkZXMgd2l0aGluIHRoZSBkYXRhIGZyYW1lLiANCg0KcGwyIDwtIGdncGxvdCh0cmFpbiwgYWVzKERhaWx5LkludGVybmV0LlVzYWdlLCBEYWlseS5UaW1lLlNwZW50Lm9uLlNpdGUpKSArIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gZmFjdG9yKENsaWNrZWQpKSkNCnBsMg0KYGBgDQoNCmBgYHtyfQ0KI1RoZXJlIGlzIHN0aWxsIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIGNsdXN0ZXJpbmcgaGVyZSwgYnV0IGluIG15IG9waW5pb24sIGl0IGFwcGVhcnMgdG8gYmUgYSB0aWdodGVyIGNsdXN0ZXIgaW4gdGVybXMgb2YgdGhlIEFyZWEgSW5jb21lLiBMZXQncyBleGFtaW5lIERhaWx5IEludGVybmV0IFVzYWdlIG1hcHBlZCBieSBBcmVhIEluY29tZS4NCnBsMyA8LSBnZ3Bsb3QodHJhaW4sIGFlcyhBcmVhLkluY29tZSwgRGFpbHkuSW50ZXJuZXQuVXNhZ2UpKSArIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gZmFjdG9yKENsaWNrZWQpKSkNCnBsMw0KDQpgYGANCg0KYGBge3J9DQojVGhpcyBwbG90IGxvb2tzIHByZXR0eSBzaW1pbGFyIHRvIHRoZSBmaXJzdCBvbmUgd2UgZXhhbWluZWQuIEdpdmVuIHRoZXNlIHR3byB2YXJpYWJsZXMgYWxvbmUsIHdlIGhhdmUgYSBwcmV0dHkgZ29vZCBpZGVhIG9mIHdoZXRoZXIgb3Igbm90IGEgdXNlciBjbGlja2VkIG9uIHRoZSBhZHMuIExldCdzIGRvIG1vcmUgRURBIHRoZW4gYmVnaW4gd29ya2luZyBvbiB0cmFpbmluZyBvdXIgbW9kZWwuDQpsaWJyYXJ5KHBsb3RseSkNCg0KcGw0IDwtIGdncGxvdCh0cmFpbiwgYWVzKEFnZSkpICsgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9ICJibHVlIiwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNSwgYmlucyA9IDQwKQ0KcGw0DQpwbDUgPC0gZ2dwbG90KHRyYWluLCBhZXMoRGFpbHkuSW50ZXJuZXQuVXNhZ2UpKSArIGdlb21faGlzdG9ncmFtKGZpbGwgPSAiYmx1ZSIsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjUsIGJpbnMgPSA0MCkNCnBsNQ0KcGw2IDwtIGdncGxvdCh0cmFpbiwgYWVzKGdlbmRlcikpICsgZ2VvbV9iYXIoYWVzKGZpbGwgPSBmYWN0b3IoZ2VuZGVyKSwgYWxwaGEgPSAwLjUpKQ0KcGw2DQpwbDcgPC0gZ2dwbG90KHRyYWluLCBhZXMoQ2xpY2tlZCwgQXJlYS5JbmNvbWUpKSArIGdlb21fYm94cGxvdChhZXMoZ3JvdXA9Q2xpY2tlZCwgZmlsbD1mYWN0b3IoQ2xpY2tlZCksIGFscGhhID0gMC40KSkNCmdncGxvdGx5KHBsNykNCmBgYA0KYGBge3J9DQojV2Ugc2VlIGZyb20gdGhlIHBsb3RzIGFib3ZlIHNvbWUgdmVyeSBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbi4gVGhlIHBlb3BsZSB0aGF0IGNsaWNrZWQgb24gdGhlIGFkcyBzcGVuZCBsZXNzIHRpbWUgb24gdGhlIGludGVybmV0IGluIGdlbmVyYWwgYW5kIG9uIHRoZSBzaXRlIGVhY2ggZGF5LiBUaGV5IGFsc28gdGVuZCB0byBoYXZlIGxvd2VyIGluY29tZXMsIHBlciB0aGUgYm94cGxvdC4gTGV0J3Mgd3JpdGUgYSBmdW5jdGlvbiB0byBpbXB1dGUgQXJlYS5JbmNvbWUgaW50byB0aGUgbWlzc2luZyBzcG90cy4NCg0KI1VzaW5nIHBsb3RseSwgd2UgY2FuIGVhc2lseSBnZXQgdGhlIG1lZGlhbiBBcmVhIEluY29tZSB0byBpbXB1dGUgZm9yIGVhY2ggZ3JvdXA6IDYyLDQzMC41NSB3aGVyZSBDbGlja2VkPTA7IDUwLDMwNi4zMSB3aGVyZSBDbGlja2VkPTEuDQoNCg0KIGltcHV0ZV9pbmNvbWUgPC0gZnVuY3Rpb24oaW5jb21lLCBjbGlja2VkKSB7DQogICBvdXQgPC0gaW5jb21lDQogICBmb3IgKGkgaW4gMTpsZW5ndGgoaW5jb21lKSl7DQogICAgIGlmKGlzLm5hKGluY29tZVtpXSkpDQogICAgew0KICAgICAgIGlmKGNsaWNrZWRbaV0gPT0gMCkNCiAgICAgICAgIHsNCiAgICAgICAgICAgIG91dFtpXSA8LSA2MjQzMC41NQ0KICAgICAgICAgfQ0KICAgICAgIGVsc2UNCiAgICAgICAgIHsNCiAgICAgICAgICAgIG91dFtpXSA8LSA1MDMwNi4zMQ0KICAgICAgICAgfQ0KICAgIH0NCiAgICAgZWxzZQ0KICAgIHsNCiAgICAgICBvdXRbaV0gPC0gaW5jb21lW2ldDQogICAgfQ0KICAgfQ0KICAgcmV0dXJuKG91dCkNCn0NCg0Kb3JpZ2luYWwuaW5jb21lcyA8LSB0cmFpbiRBcmVhLkluY29tZQ0KDQpmaXhlZC5pbmNvbWVzIDwtIGltcHV0ZV9pbmNvbWUodHJhaW4kQXJlYS5JbmNvbWUsIHRyYWluJENsaWNrZWQpDQoNCnRyYWluJEFyZWEuSW5jb21lIDwtIGZpeGVkLmluY29tZXMNCg0KI0xldCdzIGNoZWNrIHRvIHNlZSB0aGF0IGl0IHdvcmtlZCBwcm9wZXJseSENCg0KYGBgDQoNCmBgYHtyfQ0KbWlzc21hcCh0cmFpbiwgY29sID0gYygieWVsbG93IiwgImJsYWNrIikpDQpgYGANCmBgYHtyfQ0KI0dyZWF0ISBIYXZpbmcgbm8gbWlzc2luZyBkYXRhIGlzIGEgZ29vZCBmZWVsaW5nLiBOb3csIGxldCdzIHN0YXJ0IHJ1bm5pbmcgc29tZSBtb2RlbHMuIEJlZ2luIHdpdGggSy1tZWFucyBhbmQgdGhlIHJlbGV2YW50IGNvbHVtbnMuDQpsaWJyYXJ5KGNsdXN0ZXIpDQoNCmRmLnJlbGV2YW50IDwtIGRhdGEuZnJhbWUodHJhaW4kRGFpbHkuVGltZS5TcGVudC5vbi5TaXRlLCB0cmFpbiREYWlseS5JbnRlcm5ldC5Vc2FnZSkNCg0KY2x1c3Rlci5jbGljayA8LSBrbWVhbnMoZGYucmVsZXZhbnQsIDIsIG5zdGFydCA9IDEwKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoY2x1c3RlcikNCg0KI0xldCdzIGxvb2sgYXQgdGhlIGNsdXNwbG90IQ0KDQpjbHVzcGxvdChkZi5yZWxldmFudCwgY2x1c3Rlci5jbGljayRjbHVzdGVyLCBjb2xvciA9IFRSVUUsIHNoYWRlID0gVFJVRSwgbGFiZWxzID0gMCwgbGluZXMgPSAwKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkoZmFjdG9leHRyYSkNCg0Kc2lsIDwtIHNpbGhvdWV0dGUoY2x1c3Rlci5jbGljayRjbHVzdGVyLCBkaXN0KGRmLnJlbGV2YW50KSkNCmZ2aXpfc2lsaG91ZXR0ZShzaWwpDQojQWJvdmUgMC41OyBsb29rcyBwcmV0dHkgZ29vZCENCmBgYA0KDQoNCmBgYHtyfQ0KI0xldCdzIHN0YXJ0IHRoZSBLTk4gbW9kZWw6DQp2YXIodHJhaW4yWywgMV0pDQp2YXIodHJhaW4yWywgM10pDQoNCmNsaWNrZWQgPC0gdHJhaW4yWywgMTBdDQoNCmtubi5kZiA8LSBkYXRhLmZyYW1lKHRyYWluMiREYWlseS5UaW1lLlNwZW50Lm9uLlNpdGUsIHRyYWluMiREYWlseS5JbnRlcm5ldC5Vc2FnZSkNCg0KI0NCSU5EIHRoZSBjbGFzc2lmaWNhdGlvbiBjb2x1bW4NCmtubi5kZiA8LSBjYmluZChrbm4uZGYsIGNsaWNrZWQpDQoNCmtubi5zdGFuZGFyZGl6ZWQgPC0gc2NhbGUoa25uLmRmWywgLTNdKQ0KDQoNCnZhcihrbm4uc3RhbmRhcmRpemVkWywgMV0pDQp2YXIoa25uLnN0YW5kYXJkaXplZFssIDJdKQ0KYGBgDQoNCmBgYHtyfQ0KI1Rlc3QgLSBmaXJzdCAzMDAgcm93cyBmb3IgdGVzdCBzZXQNCnRlc3QuaW5kZXggPC0gMTozMDANCnRlc3QuZGF0YSA8LSBrbm4uc3RhbmRhcmRpemVkW3Rlc3QuaW5kZXgsIF0NCnRlc3QuY2xpY2tlZCA8LSBjbGlja2VkW2tubi50ZXN0LmluZGV4XQ0KDQojVHJhaW4NCnRyYWluLmRhdGEgPC0ga25uLnN0YW5kYXJkaXplZFstdGVzdC5pbmRleCwgXQ0KdHJhaW4uY2xpY2tlZCA8LSBjbGlja2VkWy10ZXN0LmluZGV4XSANCg0KYGBgDQoNCg0KYGBge3J9DQojUnVuIHRoZSBtb2RlbA0KbGlicmFyeShjbGFzcykNCg0KcHJlZGljdGlvbnMuY2xpY2tlZCA8LSBrbm4odHJhaW4uZGF0YSwgdGVzdC5kYXRhLCB0cmFpbi5jbGlja2VkLCBrPTMpDQoNCm1lYW4odGVzdC5jbGlja2VkICE9IHByZWRpY3Rpb25zLmNsaWNrZWQpDQoNCmBgYA0KDQpgYGB7cn0NCiNMZXQncyBvYnNlcnZlIHRoZSBtb2RlbCB3aXRoIG90aGVyIGstdmFsdWVzDQpwcmVkaWN0aW9ucy5jbGlja2VkIDwtIE5VTEwNCmVycm9yLnJhdGUgPC0gTlVMTA0KDQpmb3IgKGkgaW4gMToyNSkgew0KICBwcmVkaWN0aW9ucy5jbGlja2VkIDwtIGtubih0cmFpbi5kYXRhLCB0ZXN0LmRhdGEsIHRyYWluLmNsaWNrZWQsIGs9aSkNCiAgZXJyb3IucmF0ZVtpXSA8LSBtZWFuKHRlc3QuY2xpY2tlZCAhPSBwcmVkaWN0aW9ucy5jbGlja2VkKQ0KfQ0KDQpgYGANCg0KYGBge3J9DQprLnZhbHVlcyA8LSAxOjI1DQoNCmVycm9yLmRmIDwtIGRhdGEuZnJhbWUoZXJyb3IucmF0ZSwgay52YWx1ZXMpDQoNCnBsOCA8LSBnZ3Bsb3QoZXJyb3IuZGYsIGFlcyhrLnZhbHVlcywgZXJyb3IucmF0ZSkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9saW5lKGx0eT0iZG90dGVkIiwgY29sb3IgPSAicmVkIikNCmdncGxvdGx5KHBsOCkNCg0KYGBgDQoNCmBgYHtyfQ0KI1NvLCB0aGUgbW9kZWwgcnVucyBtb3N0IGFjY3VyYXRlbHkgd2l0aCBrPTM7IHNvIHRoYXQgaXMgd2hhdCB3ZSB3aWxsIGNob29zZS4NCmZpbmFsLnByZWRpY3Rpb25zLmNsaWNrZWQgPC0ga25uKHRyYWluLmRhdGEsIHRlc3QuZGF0YSwgdHJhaW4uY2xpY2tlZCwgaz0zKQ0KDQptZWFuKHRlc3QuY2xpY2tlZCAhPSBmaW5hbC5wcmVkaWN0aW9ucy5jbGlja2VkKQ0KDQojVGhlIG1vZGVsIGlzIGFwcHJveGltYXRlbHkgODMuNjclIGFjY3VyYXRlIGluIGl0J3MgcHJlZGljaXRvbnMuDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K